﻿#pragma once

#include <boost/signal.hpp>
#include <SFML/Network.hpp>
#include <queue>

#include "../../domain/configuration/GameModes.h"
#include "../../domain/models/CardsCollection.h"
#include "../../domain/models/Player.h"

namespace Views {

	class IGameplayView
	{
	public:
		virtual ~IGameplayView() {};
		typedef boost::signal<void ()> OnPlayerWinDialogClose; /**< Typ zdarzenia zamknięcia informacji o wygranej */
		typedef boost::signal<void ()> OnPlayerLoseDialogClose; /**< Typ zdarzenia zamknięcia informacji o przegranej */

		/**
		* Typ zdarzeniu zamknięcia informacji o wygranej
		* @param players_queue Kolejka wybranych graczy 
		*/
		boost::signal<void (std::queue<std::pair<Cards::PlayerCard*, Players::PLAYER_TYPE>>)> playersPickEvent;
		OnPlayerWinDialogClose playerWinDialogCloseEvent; /**< Zdarzenie zamknięcia informacji o wygranej */
		OnPlayerLoseDialogClose playerLoseDialogCloseEvent; /**< Zdarzenie zamknięcia informacji o przegranej */

		virtual void startTurn(Players::Player*) = 0; /**< Wyświetla informacje na rozpoczęcie tury */
		virtual void endTurn(Players::Player*) = 0; /**< Wyświetla informacje na zakończenie tury */
		/**
		* Rozpoczyna wybór graczy
		* @param players_cards Wszystkie karty postaci
		*/
		virtual void openPickPlayersDialog(Cards::PlayersCards players_cards) = 0;
		virtual void playerLose(Players::Player*) = 0; /**< Wyświetla informację o porażce gracza */
		virtual void playerWin(Players::Player*) = 0; /**< Wyświetla informację o zwycięstwie gracza */
	};

	/**
	* Interfejs widoku kontrolera gry klienta.
	* Zawiera specjalne funkcje wykorzystywane przez kontroler gry klienta (Controllers::ClientController) związane z podłączeniem do serwera.
	*/
	class IClientGameplayView
	{
	public:
		virtual ~IClientGameplayView() {};

		/**
		* Zdarzenie wyboru adresu serwera.
		* @param address Podany przez gracza adres.
		*/
		boost::signal<void (sf::IPAddress)> serverAddressPickEvent;

		virtual void openServerAddressDialog() = 0; /**< Rozpoczyna wybór adresu serwera przez gracza */
	};
}

